#ifndef REORDERSERVICE_H
#define REORDERSERVICE_H

#include <QObject>
#include <QString>
#include <QMutex>
#include <QTimer>
#include <memory>
#include "../data/models.h"
#include "../business/ordermanager.h"
#include "../business/menumanager.h"
#include "../utils/errorhandler.h"

namespace RestaurantSystem {

/**
 * @brief 重新下单服务类
 * 
 * 负责处理重新下单的核心业务逻辑，包括：
 * - 订单项验证和库存检查
 * - 批量处理订单项目
 * - 异常情况处理
 * - 结果统计和反馈
 */
class ReorderService : public QObject {
    Q_OBJECT
    
public:
    explicit ReorderService(QObject* parent = nullptr);
    ~ReorderService();
    
    /**
     * @brief 获取单例实例
     */
    static ReorderService& instance();
    
    /**
     * @brief 初始化服务
     * @return 初始化是否成功
     */
    bool initialize();
    
    // ========================================================================
    // 核心重新下单方法
    // ========================================================================
    
    /**
     * @brief 处理重新下单请求
     * @param originalOrder 原订单
     * @param currentUserId 当前用户ID
     * @return 重新下单结果
     */
    ReorderResult processReorder(const Order& originalOrder, const QString& currentUserId);
    
    /**
     * @brief 验证单个订单项
     * @param item 订单项
     * @return 验证结果
     */
    ItemValidationResult validateOrderItem(const OrderItem& item);
    
    /**
     * @brief 批量验证订单项
     * @param items 订单项列表
     * @return 验证结果列表
     */
    QList<ItemValidationResult> validateOrderItems(const QList<OrderItem>& items);
    
    // ========================================================================
    // 配置和状态管理
    // ========================================================================
    
    /**
     * @brief 设置最大重试次数
     * @param maxRetries 最大重试次数
     */
    void setMaxRetries(int maxRetries) { m_maxRetries = maxRetries; }
    
    /**
     * @brief 设置批处理大小
     * @param batchSize 批处理大小
     */
    void setBatchSize(int batchSize) { m_batchSize = batchSize; }
    
    /**
     * @brief 设置是否启用缓存
     * @param enabled 是否启用
     */
    void setCacheEnabled(bool enabled) { m_cacheEnabled = enabled; }
    
    /**
     * @brief 获取服务状态
     * @return 是否已初始化
     */
    bool isInitialized() const { return m_isInitialized; }
    
    // ========================================================================
    // 统计和监控
    // ========================================================================
    
    /**
     * @brief 获取处理统计信息
     * @return 统计信息映射
     */
    QHash<QString, QVariant> getProcessingStatistics() const;
    
    /**
     * @brief 重置统计信息
     */
    void resetStatistics();
    
    /**
     * @brief 清理缓存
     */
    void clearCache();

signals:
    /**
     * @brief 重新下单开始信号
     * @param orderId 原订单ID
     * @param userId 用户ID
     */
    void reorderStarted(const QString& orderId, const QString& userId);
    
    /**
     * @brief 重新下单完成信号
     * @param result 重新下单结果
     */
    void reorderCompleted(const ReorderResult& result);
    
    /**
     * @brief 重新下单失败信号
     * @param orderId 原订单ID
     * @param error 错误信息
     */
    void reorderFailed(const QString& orderId, const QString& error);
    
    /**
     * @brief 进度更新信号
     * @param current 当前进度
     * @param total 总数
     * @param itemName 当前处理的菜品名称
     */
    void progressUpdated(int current, int total, const QString& itemName);
    
    /**
     * @brief 验证完成信号
     * @param results 验证结果列表
     */
    void validationCompleted(const QList<ItemValidationResult>& results);

public slots:
    /**
     * @brief 异步处理重新下单请求
     * @param originalOrder 原订单
     * @param currentUserId 当前用户ID
     */
    void processReorderAsync(const Order& originalOrder, const QString& currentUserId);
    
    /**
     * @brief 取消当前处理
     */
    void cancelCurrentProcessing();

private slots:
    void onMenuItemUpdated(const MenuItem& item);
    void onStockUpdated(const QString& itemId, int oldStock, int newStock);
    void onCacheCleanupTimer();

private:
    /**
     * @brief 验证用户权限
     * @param originalOrder 原订单
     * @param currentUserId 当前用户ID
     * @return 是否有权限
     */
    bool validateUserPermission(const Order& originalOrder, const QString& currentUserId);
    
    /**
     * @brief 验证订单有效性
     * @param order 订单
     * @return 是否有效
     */
    bool validateOrderValidity(const Order& order);
    
    /**
     * @brief 从缓存获取菜品信息
     * @param itemId 菜品ID
     * @return 菜品信息，如果不存在返回无效对象
     */
    MenuItem getCachedMenuItem(const QString& itemId);
    
    /**
     * @brief 缓存菜品信息
     * @param item 菜品信息
     */
    void cacheMenuItem(const MenuItem& item);
    
    /**
     * @brief 生成详细的验证错误信息
     * @param item 订单项
     * @param menuItem 当前菜品信息
     * @return 错误信息
     */
    QString generateValidationError(const OrderItem& item, const MenuItem& menuItem);
    
    /**
     * @brief 计算总金额
     * @param validationResults 验证结果列表
     * @return 总金额
     */
    double calculateTotalAmount(const QList<ItemValidationResult>& validationResults);
    
    /**
     * @brief 分析验证结果
     * @param validationResults 验证结果列表
     * @return 重新下单结果
     */
    ReorderResult analyzeValidationResults(const QList<ItemValidationResult>& validationResults);
    
    /**
     * @brief 更新处理统计
     * @param result 处理结果
     */
    void updateProcessingStatistics(const ReorderResult& result);
    
    /**
     * @brief 记录操作日志
     * @param operation 操作类型
     * @param details 详细信息
     */
    void logOperation(const QString& operation, const QString& details);

private:
    static ReorderService* s_instance;
    
    // 依赖的管理器
    OrderManager* m_orderManager;
    MenuManager* m_menuManager;
    ErrorHandler* m_errorHandler;
    
    // 缓存
    QHash<QString, MenuItem> m_menuItemCache;
    QHash<QString, QDateTime> m_cacheTimestamps;
    
    // 配置参数
    int m_maxRetries;                  // 最大重试次数
    int m_batchSize;                   // 批处理大小
    int m_cacheTimeoutMinutes;         // 缓存超时时间(分钟)
    bool m_cacheEnabled;               // 是否启用缓存
    bool m_enableAsyncProcessing;      // 是否启用异步处理
    
    // 统计信息
    int m_totalProcessedOrders;        // 总处理订单数
    int m_totalSuccessfulOrders;       // 总成功订单数
    int m_totalPartialOrders;          // 总部分成功订单数
    int m_totalFailedOrders;           // 总失败订单数
    QDateTime m_lastProcessTime;       // 最后处理时间
    
    // 状态标识
    bool m_isInitialized;
    bool m_isProcessing;
    bool m_isCancelled;
    
    // 线程安全
    mutable QMutex m_mutex;
    mutable QMutex m_cacheMutex;
    mutable QMutex m_statisticsMutex;
    
    // 定时器
    QTimer* m_cacheCleanupTimer;
    
    // 默认配置
    static const int DEFAULT_MAX_RETRIES;
    static const int DEFAULT_BATCH_SIZE;
    static const int DEFAULT_CACHE_TIMEOUT_MINUTES;
};

} // namespace RestaurantSystem

#endif // REORDERSERVICE_H
